/**
 * 滚动事件管理器
 * 统一管理所有滚动事件，避免多次添加相同的事件监听器
 * 提供节流和防抖功能，优化性能
 */
class ScrollManager {
  constructor() {
    this.listeners = new Map();
    this.throttledScrollHandler = this.throttle(this.handleScroll.bind(this), 100);
    this.isListening = false;
    this.scrollTop = 0;
  }

  /**
   * 节流函数
   * @param {Function} func - 要节流的函数
   * @param {number} limit - 节流时间限制（毫秒）
   * @returns {Function} 节流后的函数
   */
  throttle(func, limit) {
    let inThrottle;
    return function() {
      const args = arguments;
      const context = this;
      if (!inThrottle) {
        func.apply(context, args);
        inThrottle = true;
        setTimeout(() => inThrottle = false, limit);
      }
    };
  }

  /**
   * 防抖函数
   * @param {Function} func - 要防抖的函数
   * @param {number} wait - 等待时间（毫秒）
   * @returns {Function} 防抖后的函数
   */
  debounce(func, wait) {
    let timeout;
    return function() {
      const args = arguments;
      const context = this;
      clearTimeout(timeout);
      timeout = setTimeout(() => func.apply(context, args), wait);
    };
  }

  /**
   * 处理滚动事件
   */
  handleScroll() {
    // 获取当前滚动位置
    this.scrollTop = window.pageYOffset || 
                    document.documentElement.scrollTop || 
                    document.body.scrollTop;

    // 触发所有注册的监听器
    this.listeners.forEach((callback) => {
      callback(this.scrollTop);
    });
  }

  /**
   * 注册滚动监听器
   * @param {string} id - 监听器唯一标识
   * @param {Function} callback - 回调函数
   * @param {Object} options - 选项
   * @param {boolean} options.useDebounce - 是否使用防抖
   * @param {number} options.debounceTime - 防抖时间（毫秒）
   */
  register(id, callback, options = {}) {
    // 如果已经存在该id的监听器，则先移除
    if (this.listeners.has(id)) {
      this.unregister(id);
    }

    // 根据选项处理回调函数
    let processedCallback = callback;
    if (options.useDebounce) {
      processedCallback = this.debounce(callback, options.debounceTime || 250);
    }

    // 注册监听器
    this.listeners.set(id, processedCallback);

    // 如果是第一个监听器，开始监听滚动事件
    if (!this.isListening && this.listeners.size > 0) {
      window.addEventListener('scroll', this.throttledScrollHandler);
      this.isListening = true;
    }

    // 立即执行一次回调，以初始化状态
    callback(this.scrollTop);
  }

  /**
   * 移除滚动监听器
   * @param {string} id - 监听器唯一标识
   */
  unregister(id) {
    this.listeners.delete(id);

    // 如果没有监听器了，停止监听滚动事件
    if (this.isListening && this.listeners.size === 0) {
      window.removeEventListener('scroll', this.throttledScrollHandler);
      this.isListening = false;
    }
  }

  /**
   * 获取当前滚动位置
   * @returns {number} 滚动位置
   */
  getCurrentScrollTop() {
    return this.scrollTop;
  }

  /**
   * 清理所有监听器
   */
  clear() {
    if (this.isListening) {
      window.removeEventListener('scroll', this.throttledScrollHandler);
      this.isListening = false;
    }
    this.listeners.clear();
  }
}

// 创建单例实例
const scrollManager = new ScrollManager();

export default scrollManager;